home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 11
/
CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso
/
cucd
/
programming
/
oberonv4
/
source
/
system
/
amigamathl.mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1996-06-02
|
8KB
|
210 lines
Syntax20b.Scn.Fnt
ParcElems
Alloc
Syntax24b.Scn.Fnt
Syntax10.Scn.Fnt
Syntax10b.Scn.Fnt
Syntax14b.Scn.Fnt
FoldElems
(* AMIGA *)
MODULE AmigaMathL; (* RD 6.8.1995, updated OJ 30 Apr 96 *)
(* Danger: access to t.l1 or t.l2 must only affect adressregs!!! (Compiler-dependent) *)
IMPORT
SYSTEM, E:=AmigaExec;
mathDBBase-, mathDTBase- : E.LibraryPtr;
mathDBVersion-, mathDTVersion- : INTEGER;
termEntry : E.TermEntry;
CONST
mathDBName*="mathieeedoubbas.library";
mathDTName*="mathieeedoubtrans.library";
TwoLInts = RECORD
l1,l2: LONGINT
END;
t, u : TwoLInts;
PROCEDURE -ReturnD0 04EH,05EH, 04EH,075H;
PROCEDURE Short*(a: LONGREAL; VAR b: REAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, a);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -102, mathDTBase );
SYSTEM.GETREG( 0, b )
END Short;
PROCEDURE Long*(a: REAL; VAR b: LONGREAL);
BEGIN
SYSTEM.PUTREG( 0, a );
SYSTEM.CALL( -108, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
b:=SYSTEM.VAL(LONGREAL, t)
END Long;
PROCEDURE Entier*(s: LONGREAL): LONGINT;
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -90, mathDBBase );
SYSTEM.CALL( -30, mathDBBase );
ReturnD0
END Entier;
PROCEDURE IntToReal*(l: LONGINT; VAR d: LONGREAL);
BEGIN
SYSTEM.PUTREG( 0, l );
SYSTEM.CALL( -36, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END IntToReal;
PROCEDURE Cmp*(s1, s2: LONGREAL): LONGINT;
(* 1 if s1>s2 0 if s1=s2 -1 if s1<s2 *)
BEGIN
t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 );
SYSTEM.CALL( -42, mathDBBase );
ReturnD0
END Cmp;
PROCEDURE Tst*(s: LONGREAL): LONGINT;
(* 1 if s>0 0 if s=0 -1 if s<0 *)
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -48, mathDBBase );
ReturnD0
END Tst;
PROCEDURE Abs*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -54, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Abs;
PROCEDURE Neg*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -60, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Neg;
PROCEDURE Add*(s1, s2: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 );
SYSTEM.CALL( -66, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Add;
PROCEDURE Sub*(s1, s2: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 );
SYSTEM.CALL( -72, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Sub;
PROCEDURE Mul*(s1, s2: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 );
SYSTEM.CALL( -78, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Mul;
PROCEDURE Div*(s1, s2: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 );
SYSTEM.CALL( -84, mathDBBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Div;
(*---------------------------------------------------*)
PROCEDURE Arctan*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -30, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Arctan;
PROCEDURE Sin*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -36, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Sin;
PROCEDURE Cos*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -42, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Cos;
PROCEDURE Exp*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -78, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Exp;
PROCEDURE Ln*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -84, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Ln;
PROCEDURE Sqrt*(s: LONGREAL; VAR d: LONGREAL);
BEGIN
t:=SYSTEM.VAL(TwoLInts, s);
SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 );
SYSTEM.CALL( -96, mathDTBase );
SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 );
d:=SYSTEM.VAL(LONGREAL, t)
END Sqrt;
PROCEDURE Ratio*(s1, s2: LONGINT; VAR d: LONGREAL);
(* returns s1/s2 *)
VAR r1,r2: LONGREAL;
BEGIN
IntToReal(s1, r1);
IntToReal(s2,r2);
Div(r1,r2,d)
END Ratio;
PROCEDURE e*(VAR d: LONGREAL);
BEGIN
t.l1:=04005BF0AH; t.l2:=08B14575DH; d:=SYSTEM.VAL(LONGREAL, t)
END e;
PROCEDURE pi*(VAR d: LONGREAL);
BEGIN
t.l1:=0400921FBH; t.l2:=054442D10H; d:=SYSTEM.VAL(LONGREAL, t)
END pi;
PROCEDURE Init;
TYPE LibraryPtr=POINTER TO E.Library;
VAR lib:LibraryPtr;
BEGIN
mathDBBase:=E.OpenLibrary(mathDBName,37);
IF mathDBBase=0 THEN HALT(99) END;
lib:=SYSTEM.VAL(LibraryPtr,mathDBBase);
mathDBVersion:=lib.version;
mathDTBase:=E.OpenLibrary(mathDTName,37);
IF mathDTBase=0 THEN HALT(99) END;
lib:=SYSTEM.VAL(LibraryPtr,mathDTBase);
mathDTVersion:=lib.version
END Init;
PROCEDURE Term;
BEGIN
E.CloseLibrary( mathDTBase );
E.CloseLibrary( mathDBBase )
END Term;
BEGIN
Init;
E.Register(termEntry, Term);
END AmigaMathL.